﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Xml;

namespace DisplayBoardInfoClient
{
    /// <summary>
    /// Klasa służąca do odczytania i udostępniania informacji z pliku konfiguracyjnego.
    /// </summary>
    class XMLConfiguration
    {
        /// <summary>
        /// Przechowuje wszystkie informacje z pliku konfiguracyjnego.
        /// </summary>
        private static Dictionary<string, string> parameters = null;
        /// <summary>
        /// Przechowuje ścieżkę do pliku konfiguracyjnego.
        /// </summary>
        private static string configurationPath;
        /// <summary>
        /// Przechowuje dokument XML pliku konfiguracyjnego.
        /// </summary>
        private static XmlDocument doc = null;
        /// <summary>
        /// Odczytuje plik konfiguracyjny i zapisuje wszyskie odczytane parametry.
        /// </summary>
        /// <param name="filePath"></param>
        public static void init(string filePath)
        {
            configurationPath = filePath;
            doc = new XmlDocument();
            doc.Load(filePath);
            XmlElement mainNode =(XmlElement)doc.GetElementsByTagName("Properties")[0];
            parameters =new Dictionary<string, string>();
            foreach(XmlElement node in mainNode.ChildNodes){
                parameters.Add(node.Name, node.InnerText);
            }
        }
        /// <summary>
        /// Zwraca wartość parametru o podanym kluczu.
        /// </summary>
        /// <param name="paramName">nazwa parametru w pliku konfiguracyjnym</param>
        /// <returns>wartość parametru w postaci tekstu</returns>
        public static string get(string paramName)
        {
            if (parameters != null)
            {
                string result;
                if (parameters.TryGetValue(paramName, out result))
                    return result;
                else
                    return null;
            }
            else
                return null;
        }
        /// <summary>
        /// Ustawia nową wartość parametru w pliku konfiguracyjnym i zapisuje nowy plik konfiguracyjny.
        /// </summary>
        /// <param name="paramName">nazwa parametru</param>
        /// <param name="paramValue">nowa wartość parametru</param>
        /// <returns>czy zapisanie się powiodło czy nie</returns>
        public static bool set(string paramName, string paramValue)
        {
            if (parameters != null)
            {
                XmlElement mainNode = (XmlElement)doc.GetElementsByTagName("Properties")[0];
                XmlNodeList list= mainNode.GetElementsByTagName(paramName);
                if(list.Count>0){
                list[0].InnerText = paramValue;
                }else{
                    XmlElement elem = doc.CreateElement(paramName);
                    elem.InnerText=paramValue;
                    mainNode.AppendChild(elem);
                }
                doc.Save(configurationPath);
                return true;
            }
            else
                return false;
        }
    }
}
